package com.hitqz.robot.driver.netty.protocol.encoder;

import cn.hutool.core.util.StrUtil;
import com.hitqz.robot.driver.dto.robot.MessageRobotDto;
import com.hitqz.robot.api.common.util.ByteUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import lombok.extern.slf4j.Slf4j;

/**
 * @author xupkun
 * @date 2023/8/4
 */
@Slf4j
public class RobotControllerEncoder extends MessageToByteEncoder<MessageRobotDto> {

    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, MessageRobotDto messageRobotDto, ByteBuf byteBuf) throws Exception {
        // 固定头部
        byteBuf.writeByte(0x5A);

        // 版本协议
        byteBuf.writeByte(0x01);

        // 序号
        byteBuf.writeBytes(ByteUtil.shortToByteBig(messageRobotDto.getSn()));

        // 数据长度
        if (messageRobotDto.getDataLength() == 0) {
            byteBuf.writeBytes(new byte[] {
                    0x00, 0x00, 0x00, 0x00
            });
        } else {
            byteBuf.writeBytes(ByteUtil.intToByteBig(messageRobotDto.getDataLength()));
        }

        // 命令类型
        byteBuf.writeBytes(ByteUtil.shortToByteBig(messageRobotDto.getCmd()));

        byteBuf.writeBytes(new byte[] {
             0x00, 0x00, 0x00, 0x00, 0x00, 0x00
        });
        // 数据
        if (StrUtil.isNotEmpty(messageRobotDto.getData())) {
            byteBuf.writeBytes(messageRobotDto.getData().getBytes());
        }
    }

}
